<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/model/DAO/DAOManager.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/model/Service/Service.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Person.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Department.php';

/**
 * Класс, отвечающий за работу со структурным подразделением.
 */
class DepartmentService extends Service {

	protected $depTypeDAO;	// Для чтения типа структурного подразделения
	protected $empDAO; // Для чтения главы

	public function __construct($daoManager){
		parent::__construct($daoManager);
		parent::createDAO("DepartmentDAO");
		$this->depTypeDAO = $this->daoManager->createDAO("DepartmentTypeDAO");
		$this->empDAO = $this->daoManager->createDAO("EmployeeDAO");
	}
	/**
	 * Сохранить структурное подразделение
	 * @param Departament $departament ДЕпартамент, который хотим сохранить
	 */
	public function save($departament){
		if($departament->getIdentity() == null){
			return $this->dao->create($departament);
		}else{
			return $this->dao->update($departament);
		}
	}

	/**
	 * Прочитать структурное подразделение
	 * @param Integer $identity Идентефикатор структурного подразделения
	 */
	public function read($identity){
		$dep = $this->dao->read($identity);

		$dep->setType($this->depTypeDAO->read($dep->getType()->getIdentity()));

		if($dep->getHead() !== null){
			$head = $this->empDAO->read($dep->getHead()->getIdentity());
		}
		return $dep;
	}
	/**
	 * Удалить структурное подразделение
	 * @param int $identity Идентефикатор структурного подразделения
	 */
	public function delete($identity){
		return $this->dao->delete($identity);
	}
	/**
	 * Получить все дочерние структурные подразделения
	 */
	public function getAll(){
		$deps = $this->dao->getAll();
		$depTypes = $this->depTypeDAO->getAll();
		// Заполняем тип структурного подразделения
		$departmentTypeMap = array();
		foreach($depTypes as $depType) {
			$departmentTypeMap[$depType->getIdentity()] = $depType;
		}
		foreach($deps as $dep){
			$dep->setType($departmentTypeMap[$dep->getType()->getIdentity()]);
		}
		// Заполняем главы структурных подразделений
		$employees = $this->empDAO->getAll();
		foreach($deps as $dep) {
			foreach ($employees as $employee)
				if($department->getHead() !== null){
				if($department->getHead()->getIdentity() === $employee->getIdentity()){
					$department->setHead($employee);
				}
			}
		}
	}

	/**
	 * Метод, отвечающий за поиск по узаканному типу структурного подразделения в БД
	 * @param DepartmentType $type Тип структурного подразделения
	 */
	public function findByType(DepartmentType $type){
		$dep = $this->dao->findByType($type);
		$dep->setType($this->depTypeDAO->read($dep->getType()->getIdentity()));
		if($dep->getHead() !== null){
			$dep->setHead($this->empDAO->read($dep->getHead()->getIdentity()));
		}
		return $dep;
	}

	/**
	 * Метод, отвечающий за поиск по узаканному главе структурного подразделения в БД
	 * @param Person $head Глава структурного подразделения
	 */
	public function findByHead(Person $head){
		$dep = $this->dao->findByHead($head);
		$dep->setType($this->depTypeDAO->read($dep->getType()->getIdentity()));
		$dep->setHead($this->empDAO->read($dep->getHead()->getIdentity()));

		return $dep;
	}

}
?>